PHP: html过滤 仅保留指定的标签、属性及CSS样式
适用于前端有限的富文本功能
<?php
function rich_text_filter($content)
{
$allowTags = array('<br>', '<b>', '<p>', '<i>', '<u>', '<div>', '<strong>', '<img>'); // 允许通过的标签
$allowAttributes = array('src', 'width', 'style'); // 允许通过的html属性
$allowCss = array("width", "text-align", "font-weight"); // 允许通过的css属性
// 删除多余标签 保留特定标签
$content = strip_tags($content, implode($allowTags));
// 删除多余数属性 和多余css
$content = preg_replace("/<\s*/", '<', $content);
$content = preg_replace_callback("/([a-zA-Z0-9\-]+)=['\"]([^'\"]*)['\"]\s*/i", function ($matches) use ($allowAttributes, $allowCss) {
if (!isset($matches[1]) || !in_array(trim($matches[1]), $allowAttributes)) {
return ' ';
}
if (trim($matches[1]) === 'style' && isset($matches[2]) && !empty($matches[2])) {
$styles = $matches[2] . (preg_match("/;$/", $matches[2]) ? '' : ';');
$styles = preg_replace_callback("/([^:;]+):([^:;]+);/", function ($items) use($allowCss) {
if (isset($items[1]) && in_array(trim($items[1]), $allowCss)) {
return $items[0];
}
return '';
}, $styles);
return sprintf('style="%s" ', $styles);
}
return sprintf(' %s ', $matches[0]);
}, $content);
return $content;
}
发表回复